package com.dayuanit.dy15.ebook.bookshop.controller;

import com.dayuanit.dy15.ebook.bookshop.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

@RestController
public class PayController extends BaseController {

    @Autowired
    private OrderService orderService;

    @RequestMapping(value = "/pay/alipayNotify")
    public void alipayNotify(HttpServletRequest request, HttpServletResponse response) {
        //HTTP请求参数中 参数名可以重复
        //username=tom&username=jack HTTP不会把相同名称的参数覆盖掉，而是放到一个数组里
//        String[] usernames = request.getParameterValues("username");

        Map<String, String[]> parameterMap = request.getParameterMap();
        parameterMap.forEach((k, v) -> System.out.println(k + " " + v[0]));

        //将Map<String, String[]> 转换为Map<String, String>
        Map<String, String> notifyParam = new HashMap<>();
        Set<Map.Entry<String, String[]>> entries = parameterMap.entrySet();
        for (Map.Entry<String, String[]> entry : entries) {
            notifyParam.put(entry.getKey(), entry.getValue()[0]);
        }

        //  校验支付宝异步通知的参数 以及 修改商户自己的订单状态
        OutputStream os = null;
        try {
            os = response.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            orderService.processAlipayNotify(notifyParam);
            //正常处理异步通知，返回给支付宝success字符串
            os.write("success".getBytes());
            os.flush();
        } catch (Exception e) {
            e.printStackTrace();
            //如果商户反馈给支付宝的字符不是 success 这7个字符，支付宝服务器会不断重发通知，直到超过24小时22分钟。
            // 一般情况下，25小时以内完成8次通知（通知的间隔频率一般是：4m,10m,10m,1h,2h,6h,15h）；
            try {
                os.write("error".getBytes());
                os.flush();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        //TODO 定时器主动查询待支付的订单 防止丢单。方案：分布式任务
        //TODO 取消订单(用户下单后，长时间不支付，则关闭订单)：方案：采用延迟队列解决定时器误差的问题，rabbitmq

        //rabbitmq  分布任务 redis 这些都是中间件技术
        //这些中间件解决什么问题？

        System.out.println("Alipay 异步通知");
    }
}
